package com.atguigu.gmall.product.util;

import org.apache.commons.io.FilenameUtils;
import org.csource.common.MyException;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient1;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;

import java.io.IOException;

/**
 * @author: 封捷
 * @create-date: 2022/8/22 10:34
 */
public class FileUploadUtil {

    // 后面执行文件上传操作需要使用的客户端对象
    private static StorageClient1 storageClient;

    static {

        try {

            // 借助当前类的 Class 对象，从类路径的根目录下加载配置文件
            String file = FileUploadUtil.class.getResource("/tracker.conf").getFile();

            // 根据文件路径执行客户端对象的相关初始化
            ClientGlobal.init(file);

            // 创建 TrackerClient 对象
            TrackerClient trackerClient = new TrackerClient();

            // 初始化 TrackerServer 对象
            TrackerServer trackerServer = trackerClient.getConnection();

            // 在静态代码块中初始化 StorageClient1 对象
            storageClient = new StorageClient1(trackerServer, null);
        } catch (IOException | MyException e) {
            e.printStackTrace();
        }

    }

    /**
     * 具体执行文件上传操作
     * @param fileByteArray 文件内容
     * @param originalFileName 原始文件名
     * @return 上传以后文件访问地址
     */
    public synchronized static String doFileUpload(byte[] fileByteArray, String originalFileName) {

        try {
            // 根据原始文件名获取文件扩展名
            String extFileName = FilenameUtils.getExtension(originalFileName);

            // 执行文件上传
            String fileAccessPath = storageClient.upload_appender_file1(fileByteArray, extFileName, null);

            // 返回已上传文件的访问地址
            return fileAccessPath;
        } catch (Exception e) {
            e.printStackTrace();

            // 封装成一个运行时异常，避免真的捕获到异常时掩盖问题
            throw new RuntimeException(e);
        }
    }

}
